//package com.hhsjdesign.dynamicui.annoprocessor
//
//import javax.lang.model.util.Elements
//import com.hhsjdesign.dynamicui.annoprocess.ABusinessBean
//import com.hhsjdesign.dynamicui.annoprocess.ABusinessCaller
//import com.hhsjdesign.dynamicui.annoprocess.ABusinessViewHolder
//import com.hhsjdesign.dynamicui.annoprocess.ADynamicUI
//import javax.lang.model.SourceVersion
//import com.squareup.kotlinpoet.*
//import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
//import java.io.IOException
//import java.util.HashSet
//import javax.annotation.processing.*
//import javax.lang.model.element.Element
//import javax.lang.model.element.TypeElement
//import javax.tools.Diagnostic
//
////注解处理器
////将文件处理在build/generated/kapt/
//class ProcessorKotlin : AbstractProcessor() {
//    val log = false
//    var messager: Messager? = null
//
//    //用于处理元素
//    var elementUtils: Elements? = null
//    private var processTimes = 0
//    var filer: Filer? = null
//    override fun getSupportedAnnotationTypes(): Set<String> {
//        val set: HashSet<String> = HashSet<String>()
//        set.add(ABusinessBean::class.java.canonicalName)
//        set.add(ABusinessCaller::class.java.canonicalName)
//        set.add(ABusinessViewHolder::class.java.canonicalName)
//        return set
//    }
//
//    override fun getSupportedSourceVersion(): SourceVersion {
//        return SourceVersion.RELEASE_8
//    }
//
//    @Synchronized
//    override fun init(processingEnv: ProcessingEnvironment) {
//        super.init(processingEnv)
//        messager = processingEnv.messager
//        elementUtils = processingEnv.elementUtils
//        filer = processingEnv.filer
//    }
//
//    override fun process(annotations: Set<TypeElement?>, roundEnv: RoundEnvironment): Boolean {
//        val moduleName: String = processingEnv.options[PACKAGE_NAME] ?: ""
//        processTimes++
//        messager!!.printMessage(
//            Diagnostic.Kind.WARNING,
//            "正在处理: " + moduleName + "包 第 " + processTimes + " 次"
//        )
//
//        if (annotations.isEmpty()) {
//            messager!!.printMessage(Diagnostic.Kind.NOTE, "process finish ...")
//            return false
//        }
//
//        //要处理的注解
//
////        for (TypeElement te : annotations) {
////            for (Element e : roundEnv.getElementsAnnotatedWith(te)) {
////                messager.printMessage(Diagnostic.Kind.OTHER, "Printing: " + e.toString());
////            }
////        }
//
//        //要处理的注解
//        val beans = roundEnv.getElementsAnnotatedWith(ABusinessBean::class.java)
//        val viewHolders = roundEnv.getElementsAnnotatedWith(ABusinessViewHolder::class.java)
//        val callers = roundEnv.getElementsAnnotatedWith(ABusinessCaller::class.java)
//
//        //打印
//        if (log)
//            messager!!.printMessage(Diagnostic.Kind.OTHER, moduleName + "找到的类：")
//        for (element in beans) {
//            //获取注解类的包名
//            val packageElement = elementUtils!!.getPackageOf(element)
//            val packagePath = packageElement.qualifiedName.toString()
//            if (log)
//                messager!!.printMessage(
//                    Diagnostic.Kind.OTHER,
//                    "Printing: " + packagePath + "." + element.simpleName.toString() + ".class"
//                )
//        }
//        for (element in viewHolders) {
//            //获取注解类的包名
//            val packageElement = elementUtils!!.getPackageOf(element)
//            val packagePath = packageElement.qualifiedName.toString()
//            if (log)
//                messager!!.printMessage(
//                    Diagnostic.Kind.OTHER,
//                    "Printing: " + packagePath + "." + element.simpleName.toString() + ".class"
//                )
//        }
//        for (element in callers) {
//            //获取注解类的包名
//            val packageElement = elementUtils!!.getPackageOf(element)
//            val packagePath = packageElement.qualifiedName.toString()
//            if (log)
//                messager!!.printMessage(
//                    Diagnostic.Kind.OTHER,
//                    "Printing: " + packagePath + "." + element.simpleName.toString() + ".class"
//                )
//        }
//        if (log)
//            messager!!.printMessage(Diagnostic.Kind.OTHER, moduleName + "找到的类：结束")
//
//        /**
//         * DynamicUIMap$$[modulename].kt
//         * object DynamicUIMap$$lib_enter {
//         *      fun beans():MutableMap<String,Class<*>>{
//         *          val result = HashMap<String,Class<*>>
//         *              ------
//         *          return result
//         *      }
//         *      fun viewHolders():MutableMap<String,Class<*>>{
//         *
//         *      }
//         *      fun callers():MutableMap<String,Class<*>>{
//         *
//         *      }
//         * }
//         */
//        //squareup.kotlinpoet 框架创建类
//        val typeSpec = makeClass(
//            moduleName,
//            beans,
//            viewHolders,
//            callers
//        )
//        if (log) {
//            messager!!.printMessage(Diagnostic.Kind.NOTE, typeSpec.toString())
//            messager!!.printMessage(Diagnostic.Kind.NOTE, "创建类结束")
//        }
//        return write2Filter(typeSpec, moduleName)
//    }
//
//    private fun makeClass(
//        moduleName: String?,
//        vararg elementSets: Set<Element>
//    ): TypeSpec {
//
//        //public class DynamicUIViewMap$$[moduleName]
//        val createclassname = "DynamicUIMap__" + moduleName!!.replace("-".toRegex(), "_")
//        messager!!.printMessage(Diagnostic.Kind.NOTE, "正在创建新类: $createclassname")
//
//        val targetClass = TypeSpec.objectBuilder(createclassname)
//
//
//        //kotlin string typename
//        val kStringType = ClassName("kotlin", "String")
//
//        //MutableMap<String,Class<*>>
//        val setClass = MutableMap::class.asTypeName()//MutableMap
//            .parameterizedBy(//<>
//                kStringType, //String
//                Class::class.asTypeName().//Class
//                parameterizedBy(//<>
//                    STAR//*
//                )
//            )
//
//        val beansType = makeMethod(
//            "beans",
//            setClass, elementSets[0],
//            ABusinessBean::class.java
//        )
//        val viewHoldersType = makeMethod(
//            "viewHolders",
//            setClass, elementSets[1],
//            ABusinessViewHolder::class.java
//        )
//        val callersType =
//            makeMethod(
//                "callers",
//                setClass, elementSets[2],
//                ABusinessCaller::class.java
//            )
//
//        return targetClass
//            .addAnnotation(ADynamicUI::class)
//            .addFunction(beansType.build())
//            .addFunction(viewHoldersType.build())
//            .addFunction(callersType.build())
//            .build()
//    }
//
//    /**
//     * @param methodName 方法名称
//     * @param returns 返回值
//     * @param elements 注解节点
//     * @param type 哪个注解
//     */
//    private fun makeMethod(
//        methodName: String,
//        returns: TypeName,
//        elements: Set<Element>,
//        type: Class<out Annotation>
//    ): FunSpec.Builder {
//        if (log)
//            messager!!.printMessage(Diagnostic.Kind.NOTE, "$TAG 创建方法： $methodName")
//
//        //方法 public static Set<Class> methodNme()
//        val methodBuilder = FunSpec.builder(methodName)
//            .returns(returns)
//
//        //第一行，创建Set<Class> result = new HashSet<Class>();
//        methodBuilder.addStatement("val result:MutableMap<String,Class<*>> = HashMap() ")
//        //循环添加注解类 result.add(package.className.class);
//        for (element in elements) {
//            //获取注解类的包名
//            val packageElement = elementUtils!!.getPackageOf(element)
//            val packagePath = packageElement.qualifiedName.toString()
//            var annoValue: String? = null
//            if (type == ABusinessBean::class.java) {
//                annoValue = element.getAnnotation(ABusinessBean::class.java).value
//            }
//            if (type == ABusinessViewHolder::class.java) {
//                annoValue = element.getAnnotation(ABusinessViewHolder::class.java).value
//            }
//            if (type == ABusinessCaller::class.java) {
//                annoValue = element.getAnnotation(ABusinessCaller::class.java).value
//            }
//
//            methodBuilder.addStatement("result[\"$annoValue\"]=Class.forName(\"" + packagePath + "." + element.simpleName.toString() + "\")")
//        }
//        //反悔注解类 return result;
//        methodBuilder.addStatement("return result")
//        if (log) {
//            messager!!.printMessage(Diagnostic.Kind.NOTE, methodBuilder.build().toString());
//            messager!!.printMessage(Diagnostic.Kind.NOTE, "创建方法结束")
//        }
//        return methodBuilder
//    }
//
//    private fun write2Filter(typeSpec: TypeSpec, moduleName: String): Boolean {
//        try {
//            //将文件写入然后再执行一次注解处理，创建javafile，并写进filer
//            FileSpec.builder(
//                FRAMEWORK_NAME,
//                "DynamicUIMap__" + moduleName!!.replace("-".toRegex(), "_")
//            )
//                .addType(typeSpec).build()
//                .writeTo(filer!!)
//
//            messager!!.printMessage(
//                Diagnostic.Kind.NOTE, "$TAG [$moduleName] process end ..."
//            )
//
//            //返回true表示 注解处理动作结束
//            return false
//        } catch (e: IOException) {
//            e.printStackTrace()
//            messager!!.printMessage(Diagnostic.Kind.NOTE, "$TAG process error ...")
//        }
//        return false
//    }
//
//    companion object {
//        var PACKAGE_NAME = "SEGI_DYNAMIC_UI"
//        var FRAMEWORK_NAME = "com.hhsjdesign.dynamicui.generate"
//        var TAG = "_PROCESS"
//    }
//}